package tratamientoDatos;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.osmdroid.util.GeoPoint;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import android.content.Context;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

public class ParseoArchivoRuta {
	
	private Ruta ruta;

	public ParseoArchivoRuta(Context contexto, String nombre){
		
		boolean sdDisponible = false;
		String estado = Environment.getExternalStorageState();

		if (estado.equals(Environment.MEDIA_MOUNTED)) {
			sdDisponible = true;
		} else {
			sdDisponible = false;
			Toast toast = Toast.makeText(
					contexto,
					"ERROR: SD NO DISPONIBLE",
					Toast.LENGTH_SHORT);
			toast.show();
		}
		if (sdDisponible) {
			File f = abrirFichero(nombre);
			DataInputStream in = null;
			
			byte[] buffer = new byte[(int) f.length()];
			try {
				in = new DataInputStream(new FileInputStream(f));
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			try {
				in.readFully(buffer);
			} catch (IOException e) {
				e.printStackTrace();
			}
			Document dom = parsearFichero(f);
			Element elem = dom.getDocumentElement();

			NodeList items = elem.getElementsByTagName("trkpt");

			this.ruta = new Ruta();
			for (int i = 0; i < items.getLength(); i++) {

				Node nodo = items.item(i);

				int altitud = Integer.parseInt(nodo
						.getFirstChild().getFirstChild()
						.getNodeValue());
				long tiempo = Long.parseLong(nodo
						.getLastChild().getFirstChild()
						.getNodeValue());

				NamedNodeMap atributos = nodo.getAttributes();
				Node lati = atributos.getNamedItem("lat");
				Node longi = atributos.getNamedItem("lon");
				float latitud = Float.parseFloat(lati
						.getTextContent());
				float longitud = Float.parseFloat(longi
						.getTextContent());

				GeoPoint puntoCargado = new GeoPoint(latitud,
						longitud, altitud);
				ruta.getCamino().put(tiempo, puntoCargado);

			}

			if (ruta.getCamino().size() == items.getLength()
					&& items.getLength() > 0) {
				Toast toast = Toast.makeText(
						contexto, "Ruta "
								+ nombre
								+ " cargada con exito",
						Toast.LENGTH_SHORT);
				toast.show();
			}
		}

	}

	protected Document parsearFichero(File f) {

		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			try {
				Document dom = builder.parse(f);
				return dom;
			} catch (SAXException e) {
				e.printStackTrace();
				Log.e("Parser",
						"Error SAX en parser" + e.getCause() + " "
								+ e.getMessage());
			} catch (IOException e) {
				e.printStackTrace();
				Log.e("Parser", "Error IO en parser");
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
			Log.e("Builder", "Error creando el documentBuilder");
		}

		return null;
	}

	protected File abrirFichero(String seleccion) {

		try {
			File ruta_sd = Environment.getExternalStorageDirectory();

			File f = new File(ruta_sd.getAbsolutePath(), seleccion + ".gpx");
			return f;
		} catch (Exception ex) {
			Log.e("Ficheros", "Error al leer fichero desde tarjeta SD");
		}
		return null;

	}

	public Ruta getRuta() {
		return ruta;
	}

	public void setRuta(Ruta ruta) {
		this.ruta = ruta;
	}

}
